<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>webScoket</title>
  <style>
    * {
      box-sizing: border-box;
      overflow: hidden;
    }
    html, body {
      padding: 0;
      margin: 0;
    }
    .config {
      position: absolute;
      z-index: 100;
      width: 100%;
      height: 100%;
      background: #40E0D0;  /* fallback for old browsers */
      background: -webkit-linear-gradient(to right, #FF0080, #FF8C00, #40E0D0);  /* Chrome 10-25, Safari 5.1-6 */
      background: linear-gradient(to right, #FF0080, #FF8C00, #40E0D0); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
      display: flex;
      align-items: center;
      justify-content: center;
    }

    .config--box {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      background-color: #f5f5f5;
      border: 1px solid #ccc;
      border-radius: 5px;
      padding: 20px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .config--title {
      font-size: 24px;
      font-weight: bold;
      margin-bottom: 20px;
    }

    .config--ipt {
      display: flex;
      align-items: center;
      justify-content: center;
      margin-bottom: 20px;
    }

    .config--ipt input {
      border: none;
      border-radius: 5px;
      padding: 10px;
      font-size: 16px;
      outline: none;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .config--btn button {
      border: none;
      border-radius: 5px;
      padding: 10px 20px;
      font-size: 16px;
      font-weight: bold;
      color: #fff;
      background-color: #007bff;
      cursor: pointer;
      outline: none;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .config--btn button:hover {
      background-color: #0069d9;
    }

    .index {
      display: flex;
      flex-direction: column;
      height: 100vh;
      background-color: #f5f5f5;
      padding: 20px;
    }

    #index #messageBox {
      display: flex;
      flex-direction: column;
      align-items: flex-start;
      justify-content: flex-start;
      height: calc(100vh - 200px);
      overflow-y: auto;
    }

    #index #messageBox div {
      width: 100%;
      border-radius: 5px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
      padding: 10px;
      margin-bottom: 10px;
    }

    #index #messageBox div span {
      font-weight: bold;
      margin-right: 10px;
    }

    #index #messageBox div p {
      margin: 0;
    }

    #messageBox {
      display: flex;
      flex-direction: column;
      align-items: flex-start;
      justify-content: flex-start;
      height: 400px;
      overflow-y: auto;
    }

    .left {
      display: flex;
      flex-direction: row;
      align-items: center;
      justify-content: flex-start;
      margin-bottom: 10px;
      background-color: #fff;
      color: #333;
      border-radius: 20px;
      padding: 10px 15px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .right {
      display: flex;
      flex-direction: row;
      align-items: center;
      justify-content: flex-end;
      margin-bottom: 10px;
      background-color: #def1fc;
      color: #333;
      border-radius: 20px;
      padding: 10px 15px;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }

    .operation {
      position: relative;
    }

    #index textarea {
      border: none;
      border-radius: 5px;
      padding: 10px;
      font-size: 16px;
      outline: none;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
      margin-right: 10px;
      flex-grow: 1;
      width: 100%;
    }

    #index button {
      border: none;
      border-radius: 5px;
      padding: 10px 20px;
      font-size: 16px;
      font-weight: bold;
      color: #fff;
      background-color: #007bff;
      cursor: pointer;
      outline: none;
      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
      position: absolute;
      right: 20px;
      top: 20px;
    }

    #index button:hover {
      background-color: #0069d9;
    }
  </style>
</head>
<body>
  <div id="config" class="config">
    <div class="config--box">
      <div class="config--title">在线webScoket测试</div>
      <div class="config--ipt">
        <input id="address" placeholder="请输入ws地址" />
      </div>
      <div class="config--btn">
        <button id="connectBtn">链接</button>
      </div>
    </div>
  </div>
  <div id="index" class="index">
    <div id="messageBox">
      <div class="left"></div>
      <div class="right"></div>
    </div>
    <div class="operation">
      <textarea id="chat" cols="30" rows="10" placeholder="发送消息"></textarea>
      <button id="sendBtn">发送</button>
    </div>
  </div>
  <script>
    const state = {
      // ws地址链接
      address: ''
    }
    let ws = null;
    const list = [];
    const connectBtn = document.getElementById('connectBtn');
    const address = document.getElementById('address');
    const sendBtn = document.getElementById('sendBtn');
    const outPut = (obj) => {
        list.push({
          key: list.length,
          ...obj
        })
        let str = ''
        list.forEach(item => {
          str += `<div class="${item.position}">${item.msg}</div>`
        });
        document.getElementById('messageBox').innerHTML = str;
      }
    function send(msg) {
      if(ws) {
        ws.send(msg)
      }
    }
    connectBtn.addEventListener('click', function() {
      state.address = address.value;
      if(address.value.length > 0) {
        if(!ws) {
        ws = new WebSocket(address.value);
        // 连接成功后的回调函数
        ws.onopen = function (params) {
          outPut({
            position: 'left',
            msg: state.address + ' >>>> 客户端连接成功！'
          })
        };
        // 从服务器接受到信息时的回调函数
        ws.onmessage = function (e) {
          outPut({
            position: 'left',
            msg: "收到服务端返回的数据:>>>> " + e.data.toString()
          })
        };
        // 连接关闭后的回调函数
        ws.onclose = function(evt) {
          outPut({
            position: 'left',
            msg: '关闭客户端连接！'
          })
        };
        // 连接失败后的回调函数
        ws.onerror = function (evt) {
          outPut({
            position: 'left',
            msg: '连接失败了！'
          });
        };
      } else {
          outPut({
            position: 'left',
            msg: '已经和 >>>>' + ipt.value + '<<<< 建立了链接！'
          });
        }
        document.getElementById('config').style.display = 'none';
      }
    });
    sendBtn.addEventListener('click', function() {
      const msg = document.getElementById('chat').value;
      outPut({
          position: 'right',
          msg,
        })
      send(msg);
    })
  </script>
</body>
</html>